package com.itheima.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.reggie.common.GlobalConstant;
import com.itheima.reggie.common.R;
import com.itheima.reggie.entity.Category;
import com.itheima.reggie.service.ICategoryService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

/**
 * 分类控制器
 * @author Dui
 * @since 2022/11/2 15:17
 */
@Slf4j
@RestController
@RequestMapping("/category")
public class CategoryController {
    private final ICategoryService categoryService;

    public CategoryController(ICategoryService categoryService) {
        this.categoryService = categoryService;
    }


    // 1. 请求路径
    // 2. 请求方式
    // 3. 请求参数
    // 4. 返回值
    /**
     * 修改分类
     */
    @PutMapping
    public R<String> update(@RequestBody Category categoryParam) {
        // 参数校验
        // 方法返回
        this.categoryService.updateById(categoryParam);
        return R.success(GlobalConstant.SUCCESS);
    }

    // 1. 请求路径
    // 2. 请求方式
    // 3. 请求参数
    // 4. 返回值
    // 路径传参,是用{}在请求地址中加id category/456789

    /**
     * 删除分类
     */
    @DeleteMapping
    public R<String> delete(Long id) {
        // 删除
//        this.categoryService.removeById(id);
        this.categoryService.deleteById(id);
        return R.success(GlobalConstant.SUCCESS);
    }


    // 1. 请求路径
    // 2. 请求方式
    // 3. 请求参数
    // 4. 返回值
    @GetMapping("/page")
    public R<Page<Category>> getPage(Integer page, Integer pageSize) {
        log.info("前后端连通");
        // 1.要有Page分页对象,在这个对象中,
        // 要赋值:当前页current,和当前页要显示多少行Size
//        Page<Category> queryPage = new Page<>(page,pageSize);
        Page<Category> queryPage = new Page<>(page, pageSize);
        // 当前页
        queryPage.setCurrent(page);
        // 当前页要显示多少行
        queryPage.setSize(pageSize);
        // 排序的条件
        LambdaQueryWrapper<Category> queryWrapper = new LambdaQueryWrapper<>();
        // 根据sort字段做升序
        // 升序0 -> 10
        // 降序10 -> 0
        queryWrapper.orderByAsc(Category::getSort);
        Page<Category> result = this.categoryService.page(queryPage, queryWrapper);
        // 会把查询后的结果,保存到分页对象中
        // 我们也可以用返回值的方式来写
        // 也可以直接用分页对象返回数据
//        this.categoryService.page(queryPage, queryWrapper);
        return R.success(result);
    }


    // 1. 请求路径
    // 2. 请求方式
    // 3. 请求参数
    // 4. 返回值
    @PostMapping
    public R<String> save(@RequestBody Category categoryParam) {
        log.info("前后端连通");
        log.info("categoryParam ===> {}", categoryParam.toString());
        // 参数校验
        // 分类名称
        Boolean checkParam = this.checkParam(categoryParam);
        // 未校验成功
        if (!checkParam) {
            return R.error(GlobalConstant.FAILED);
        }
        // controller --> service --> mapper
        boolean isFinished = this.categoryService.save(categoryParam);
        return isFinished ?
                R.success(GlobalConstant.SUCCESS) :
                R.error(GlobalConstant.FAILED);
    }

    /**
     * 参数校验
     */
    private Boolean checkParam(Category categoryParam) {
        if (StringUtils.isBlank(categoryParam.getName())) {
            return Boolean.FALSE;
        }
        if (categoryParam.getSort() == null) {
            return Boolean.FALSE;
        }
        if (categoryParam.getType() == null) {
            return Boolean.FALSE;
        }
        return Boolean.TRUE;
    }
}
